#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdarg.h>
#include "mcp_logger.h"

typedef struct {
    FILE *file;
    int level;
    int use_console;
} logger_t;

// LEVEL 0:DEBUG,1:INFO,2:WARN,3:ERROR,other.UNKNOWN
static logger_t global_logger = { NULL, 0, 1 };

int logger_init(const char *filename, int level, int use_console) {
    if (filename) {
        global_logger.file = fopen(filename, "a");
        if (!global_logger.file) {
            return -1;
        }
    }
    global_logger.level = level;
    global_logger.use_console = use_console;
    return 0;
}

void logger_cleanup() {
    if (global_logger.file) {
        fclose(global_logger.file);
        global_logger.file = NULL;
    }
}

void logger_write(int level, const char *file, int line, const char *fmt, ...) {
    if (level < global_logger.level) {
        return;
    }

    // 获取时间
    time_t now = time(NULL);
    struct tm *tm_info = localtime(&now);
    char time_str[20];
    strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", tm_info);

    // 级别字符串
    const char *level_str;
    switch(level) {
        case 0: level_str = "DEBUG"; break;
        case 1: level_str = "INFO"; break;
        case 2: level_str = "WARN"; break;
        case 3: level_str = "ERROR"; break;
        default: level_str = "UNKNOWN"; break;
    }

    // 格式化日志头
    char header[256];
    snprintf(header, sizeof(header), "[%s] [%s] [%s:%d] ", time_str, level_str, file, line);

    // 格式化日志内容
    char message[1024];
    va_list args;
    va_start(args, fmt);
    vsnprintf(message, sizeof(message), fmt, args);
    va_end(args);

    // 输出到控制台
    if (global_logger.use_console) {
        fprintf(stderr, "%s%s\n", header, message);
        fflush(stderr);
    }

    // 输出到文件
    if (global_logger.file) {
        fprintf(global_logger.file, "%s%s\n", header, message);
        fflush(global_logger.file);
    }
}



// 使用示例
int test() {
    // 初始化日志系统：输出到文件和控制台，级别为DEBUG
    if (logger_init("app.log", 0, 1) != 0) {
        fprintf(stderr, "无法初始化日志文件\n");
        return 1;
    }

    LOG_DEBUG("应用程序启动");
    LOG_INFO("系统初始化完成");

    // 模拟一些操作
    for (int i = 0; i < 5; i++) {
        LOG_DEBUG("处理第 %d 个任务", i + 1);

        if (i == 3) {
            LOG_WARN("遇到特殊情况 i=%d", i);
        }
    }

    LOG_INFO("应用程序正常退出");
    logger_cleanup();
    return 0;
}